package com.example.mysql.学习笔记.高级.数据库的优化之索引.索引的创建和设计原则;

public class MySQL8型特性 {
}

/**
 * 支持降序索引
 * 降序索引以降序存储键值。
 * 虽然在语法上,从MySQL 4 版本开始就已经支持降序索引的语法了,
 * 但实际上该DESC定义是被忽略的，
 * 直到MySQL 8.x版本才开始真正支持降序索引(仅限于InnoDB存储引擎)。
 * MySQL在8.0版本之前创建的仍然是升序索引，使用时进行反向扫描，这大大降低了数据库的效率。
 * 在某些场景下，降序索引意义重大。
 * 例如，如果一个查询， 需要对多个列进行排序，且顺序要求不一致,
 *      那么使用降序索引将会避免数据库使用额外的文件排序操作，从而提高性能。
 *
 */

/**
 * 隐藏索引   使此索引不能动用   主要用来测试此索引的性能用之前和用之后区别
 * 在MySQL 5.7版本及之前，只能通过显式的方式删除索引。
 * 此时，如果发现删除索引后出现错误，又只能通过显式创建索弓的方式将删除的索引创建回来。
 * 如果数据表中的数据量非常大,或者数据表本身比较大，这种操作就会消耗系统过多的资源，操作成本非常高
 *
 * 从MySQL 8.x开始支持隐藏索引(invisible indexes) ，只需要将待删除的索引设置为隐藏索引,
 * 使查询优化器不再使用这个索引(即使使用force index (强制使用索引)，优化器也不会使用该索引)，
 * 确认将索引设置为隐藏索引后系统不受任何响应，就可以彻底删除索引。
 * 这种通过先将索引设置为隐藏索引，再删除索引的方式就是软删除。
 *
 * 同时，如果你想验证某个索引删除之后的查询性能影响，就可以暂时先隐藏该索引。
 *
 * 注意:
 * 主键不能被设置为隐藏索引。当表中没有显式主键时，
 * 表中第-个唯一非空索引会成为隐式主键，也不能设置为隐藏索引。
 *
 * 索引默认是可见的，在使用
 * CREATE TABLE, CREATE INDEX或者ALTER TABLE等语句时可以通过VISIBLE或者
 * INVISIBLE关键词设置索引的可见性。
 *
 * 添加的时候设置索引不可见
 *
 * CREATE TABLE 表名(
 * 字段一  类型，
 * 字段二  类型，
 * 字段三  类型，
 * 字段四  类型，
 * INDEX 索引名(字段) invisible
 *
 * )
 *
 * ALTER TABLE 表名
 * ADD UNIQUE INDEX 索引名(字段) invisible;
 *
 * CREATE INDEX 索引名 ON 表名(字段名) invisible;
 *
 * 已存在的索引设置不可见
 * ALTER TABLE 表名 ALTER INDEX 索引名 invisible
 *
 * invisible (看不见的)  表示此索引不可见
 *
 * 索引设置可见
 * ALTER TABLE 表名 ALTER INDEX 索引名 visible;
 *
 * visible(看的见的)
 *
 * 查询语句前加EXPLAIN 会显示  查询使使用情况（如 所用索引 时间等等）
 *
 * 注意
 * 当索引被隐藏时，它的内容仍然是和正常索引-样实时更新的q如果一个索引需要长期被隐藏，
 * 那么可以将其删除，因为索引的存在会影响插入、更新和删除的性能。
 *
 * #了解:使隐藏索引对 查询优化器可见  意义不大 因为隐藏索引目的就是为了对比数据库的优化成都
 * SET SESSION optimizer_switch="use_invisible_indexes=on";
 * SET SESSION optimizer_switch="use_invisible_indexes=off";//默认
 *
 *
 *
 */
